package Utils;

import domain.PDU.Tag.TagType;

import java.util.HashMap;

/**
 * @Author: ylc
 * @Description:
 */
public class EncodingUtil {
    Util util = new Util();
    HashMap<String, Byte> tagCoding = TagType.getTagCoding();

    /**
     * 对INTEGER进行BER编码
     * @param i
     * @return
     */
    public byte[] getIntegerCoding(int i){
        byte[] T = new byte[]{tagCoding.get("INTEGER")};
        byte[] V = util.toByteArray(i);
        byte[] L = util.exLength(V.length);

        return util.spliceArr(T, L, V);
    }

    public byte[] getBooleanCoding(String value){
        byte[] T = new byte[]{tagCoding.get("BOOLEAN")};
        byte[] V;
        if(value == "TRUE"){
            V = new byte[]{(byte)0xFF};
        }else{
            V = new byte[]{(byte)0x00};
        }
        byte[] L = util.exLength(V.length);

        return util.spliceArr(T, L, V);
    }

    /**
     * 对OBJECT STRING类型进行编码
     * @param s
     * @return
     */
    public byte[] getObjectStringCoding(String s) {
        byte[] T = new byte[]{tagCoding.get("OCTET STRING")};
        char[] cs = s.toCharArray();
        byte[] V = new byte[cs.length];
        for (int i = 0; i < cs.length; i++) {
            V[i] = (byte)cs[i];
        }

        byte[] L = util.exLength(V.length);
        return util.spliceArr(T, L, V);
    }

    /**
     * 对NULL类型进行BER编码
     * @return
     */
    public byte[] getNullCoding() {
        return new byte[]{5, 0};
    }

    /**
     * 对OBJECT IDENTIFIER类型进行编码
     * @param id
     * @return
     */
    public byte[] getOIDCoding(String id) {
        byte[] T = new byte[]{tagCoding.get("OBJECT IDENTIFIER")};
        String[] ID = id.split("\\.");
        byte[] V = new byte[ID.length];

        byte curId = 0;
        //简单实现，对多个八位组的数字未进行设计
        for (int i = 0; i < V.length; i++) {
            curId = (byte)(Integer.parseInt(ID[i]) & 0xFF);
            V[i] = curId;
        }

        byte[] L = util.exLength(V.length);
        return util.spliceArr(T, L, V);
    }
}
